﻿using System;
using System.Reflection;

// 1. 数学计算接口 (相当于IMath类库)
public interface IMathOperations
{
    int Add(int a, int b);
    int Subtract(int a, int b);
    int Multiply(int a, int b);
    int Divide(int a, int b);
}

// 2. 数学计算实现类 (相当于Math类库)
public class MathCalculator : IMathOperations
{
    public int Add(int a, int b)
    {
        return a + b;
    }

    public int Subtract(int a, int b)
    {
        return a - b;
    }

    public int Multiply(int a, int b)
    {
        return a * b;
    }

    public int Divide(int a, int b)
    {
        if (b == 0) throw new DivideByZeroException("除数不能为零");
        return a / b;
    }
}

// 3. 控制台应用程序 - 使用反射技术
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("=== 反射技术实现数学计算 ===");

        // 使用反射创建IMathOperations接口的实例
        Type mathType = typeof(MathCalculator);
        object mathInstance = Activator.CreateInstance(mathType);

        // 验证实例是否实现了IMathOperations接口
        if (mathInstance is IMathOperations mathOps)
        {
            // 直接使用接口调用（正常方式）
            Console.WriteLine("\n=== 直接接口调用 ===");
            TestMathOperations(mathOps);
        }

        // 使用反射方式调用方法
        Console.WriteLine("\n=== 反射方式调用 ===");
        TestWithReflection(mathInstance);

        Console.WriteLine("\n=== 测试完成 ===");
        Console.ReadKey();
    }

    static void TestMathOperations(IMathOperations math)
    {
        Console.WriteLine($"加法: 10 + 5 = {math.Add(10, 5)}");
        Console.WriteLine($"减法: 10 - 5 = {math.Subtract(10, 5)}");
        Console.WriteLine($"乘法: 10 * 5 = {math.Multiply(10, 5)}");
        Console.WriteLine($"除法: 10 / 5 = {math.Divide(10, 5)}");
    }

    static void TestWithReflection(object mathInstance)
    {
        Type type = mathInstance.GetType();

        // 使用反射调用Add方法
        MethodInfo addMethod = type.GetMethod("Add");
        object addResult = addMethod.Invoke(mathInstance, new object[] { 10, 5 });
        Console.WriteLine($"反射加法: 10 + 5 = {addResult}");

        // 使用反射调用Subtract方法
        MethodInfo subtractMethod = type.GetMethod("Subtract");
        object subtractResult = subtractMethod.Invoke(mathInstance, new object[] { 10, 5 });
        Console.WriteLine($"反射减法: 10 - 5 = {subtractResult}");

        // 使用反射调用Multiply方法
        MethodInfo multiplyMethod = type.GetMethod("Multiply");
        object multiplyResult = multiplyMethod.Invoke(mathInstance, new object[] { 10, 5 });
        Console.WriteLine($"反射乘法: 10 * 5 = {multiplyResult}");

        // 使用反射调用Divide方法
        MethodInfo divideMethod = type.GetMethod("Divide");
        object divideResult = divideMethod.Invoke(mathInstance, new object[] { 10, 5 });
        Console.WriteLine($"反射除法: 10 / 5 = {divideResult}");

        // 获取接口信息
        Console.WriteLine("\n=== 接口信息 ===");
        Type[] interfaces = type.GetInterfaces();
        foreach (Type interfaceType in interfaces)
        {
            Console.WriteLine($"实现的接口: {interfaceType.Name}");

            // 显示接口中的方法
            MethodInfo[] interfaceMethods = interfaceType.GetMethods();
            foreach (MethodInfo method in interfaceMethods)
            {
                Console.WriteLine($"  - 方法: {method.Name}");
            }
        }
    }
}